<?php
require_once 'IResult.class.php';

abstract class AbstractResult implements IResult {
    
    /* Atributo de log para todas as classes filhas. */
    protected $log;

    private $success = IResult::SUCESSO;
    private $errorTitle;
    private $errorMsg;
    private $numAffectedRows;
    private $result;
    private $arrayResult;
    private $showHeaderError = false;
    
    /**
     * Default constructor.
     */
    public function __construct() {
        $this->log = new Log();
    }

    public function isSuccess() {
        return $this->success;
    }

    public function setSuccess($success) {
        $this->success = $success;
    }

    public function getShowHeaderError() {
        return $this->showHeaderError;
    }

    public function setShowHeaderError($showHeaderError) {
        $this->showHeaderError = $showHeaderError;
    }

    public function getErrorTitle() {
        return $this->errorTitle;
    }

    public function setErrorTitle($errorTitle) {
        $this->errorTitle = $errorTitle;
    }

    public function getErrorMsg() {
        return $this->errorMsg;
    }

    public function setErrorMsg($errorMsg) {
        $this->errorMsg = $errorMsg;
    }

    public function getNumRowsAffected() {
        return $this->numAffectedRows;
    }

    public function setNumRowsAffected($numAffectedRows) {
        $this->numAffectedRows = $numAffectedRows;
    }

    public function getResult() {
        return $this->result;
    }

    public function setResult($result) {
        $this->result = $result;
    }

    /**
     * Array Result é usado para arrays que não tem origem do banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     * @return array
     */
    public function getArrayResult() {
        return $this->arrayResult;
    }

    /**
     * Array Result é usado para arrays que não tem origem do banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     * @return array
     */
    public function setArrayResult($arrayResult) {
        $this->arrayResult = $arrayResult;
    }

    public function showResult() {
        if($this->log->isDebugEnabled()) {
            $this->log->logDebug('Entrou no método showResult()');
        }
        
        header('Content-Type: application/json;charset=' . IResult::ENCODING);
        echo '{"success":'. $this->success;
        
        if (IResult::SUCESSO == $this->success || IResult::SUCESSO_LIMPAR == $this->success) {
            if($this->log->isDebugEnabled()) {
                $this->log->logDebug('Montando json de sucesso.');
            }
            
            if (isset($this->numAffectedRows)) {
                if($this->log->isDebugEnabled()) {
                    $this->log->logDebug('Com ' . $this->numAffectedRows . ' linhas de resultado.');
                }
                //Num Rows
                echo ',"numRows":' . $this->numAffectedRows;
            }
            
            if(isset($this->result)) {
                if($this->log->isDebugEnabled()) {
                    $this->log->logDebug('Resultado simples.');
                }
                echo ',"data":';
                echo json_encode($this->result);
            } else if (isset($this->arrayResult)) {
                if($this->log->isDebugEnabled()) {
                    $this->log->logDebug('Resultado com várias linhas.');
                }
                echo ',"data":[';
                $i = 0;
                foreach ($this->arrayResult as $obj) {
                    echo $i++ > 0 ? ',' : '';
                    echo json_encode($obj);
                }
                echo ']';
            }
        } else {
            if ($this->showHeaderError) {
                header('HTTP/1.1 500 Internal Server Error');
            }
            
            if (!isset($this->arrayResult)) {
                if($this->log->isDebugEnabled()) {
                    $this->log->logDebug('Montando json de erro simples.');
                }
                echo ',"errors":{"title":"' . (strlen($this->errorTitle) != 0 ? $this->errorTitle : IResult::DEFAULT_TITLE_ERROR) . '",';
                echo '"errormsg":"' . (strlen($this->errorMsg) != 0 ? $this->errorMsg : IResult::DEFAULT_MSG_ERROR) . '"}';
            } else {
                if($this->log->isDebugEnabled()) {
                    $this->log->logDebug('Montando json de erro composto.');
                }
                echo ',"errors":[';
                $count = 0;
                foreach (array_keys($this->arrayResult) as $keyArrayResult) {
                    if ($count++ > 0) {
                        echo ',';
                    }
                    echo '{"' . $keyArrayResult . '":"' . $this->arrayResult[$keyArrayResult] . '"}';
                }
                echo ']';
            }
        }
        
        echo '}';
    }
}

?>
